package de.gwtprime.shared.util;

import java.io.Serializable;

/**
 * This is a pair of generic types.
 *
 * @param <A> Type of first element
 * @param <B> Type of second element
 */
public class Pair<A, B> implements Serializable, Comparable<Pair<A, B>>
{
    private static final long serialVersionUID = -2048821943238944258L;

    public final A fst;

    public final B snd;

    public Pair(A fst, B snd)
    {
        this.fst = fst;
        this.snd = snd;
    }

    public String toString()
    {
        return "Pair[" + fst + "," + snd + "]";
    }

    private static boolean equals(Object x, Object y)
    {
        return (x == null && y == null) || (x != null && x.equals(y));
    }

    @Override
    public boolean equals(Object other)
    {
        return other instanceof Pair && equals(fst, ((Pair<?, ?>) other).fst)
                && equals(snd, ((Pair<?, ?>) other).snd);
    }
    
    @Override
    public int hashCode()
    {
        if (fst == null)
            return (snd == null) ? 0 : snd.hashCode() + 1;
        else if (snd == null)
            return fst.hashCode() + 2;
        else return fst.hashCode() * 17 + snd.hashCode();
    }

    public static <A, B> Pair<A, B> of(A a, B b)
    {
        return new Pair<A, B>(a, b);
    }

	@Override
	public int compareTo(Pair<A, B> p)
	{
		String two = p.toString().toLowerCase();
		String one = this.toString().toLowerCase();
		
		return one.compareTo(two);
	}
}
